#include<iostream>
#include<string>
#include<vector>
#include<unistd.h>

pthread_cond_t gcond=PTHREAD_COND_INITIALIZER;//条件变量
pthread_mutex_t gmutex=PTHREAD_MUTEX_INITIALIZER;//互斥锁

void* SlaverCore(void* args)
{
    std::string name=static_cast<const char*>(args);
    //被唤醒
    while(true)
    {
        pthread_mutex_lock(&gmutex);//加锁

        //一般条件变量在加锁与解锁之间使用
        pthread_cond_wait(&gcond,&gmutex);

        //等待成功，被唤醒了
        std::cout<<"当前被唤醒的线程为:"<<name<<std::endl;

        pthread_mutex_unlock(&gmutex);//解锁

    }
}
void* MasterCore(void* args)
{
    sleep(3);
    std::cout<<"master 开始工作..."<<std::endl;
    //唤醒
    while(true)
    {
        //pthread_cond_broadcast(&gcond);
        pthread_cond_signal(&gcond);

        std::cout<<"master 唤醒线程..."<<std::endl;

        sleep(1);
    }
}

//创建一批被控制的线程
void StartSlaver(std::vector<pthread_t> *tidsptr,int num=3)
{
    for(int i=0;i<num;i++)
    {
        pthread_t tid;
        char *name=new char[64];
        snprintf(name,64,"slaver-%d",i+1);
        int n=pthread_create(&tid,nullptr,SlaverCore,name);
        if(n==0)
        {
            std::cout<<"create success: "<<name<<std::endl;
            tidsptr->emplace_back(tid);
        }
    }
}

//创建主线程
void StartMaster(std::vector<pthread_t> *tidsptr)
{
    pthread_t tid;
    int n=pthread_create(&tid,nullptr,MasterCore,nullptr);
    if(n==0)//创建成功
    {
        std::cout<<"create master success"<<std::endl;
    }
    tidsptr->emplace_back(tid);
}

void WaitThread(std::vector<pthread_t> tids)
{
    for(auto &tid:tids)
    {
        pthread_join(tid,nullptr);//等待线程
    }
}
int main()
{
    std::vector<pthread_t> tids;//存线程id
    StartMaster(&tids);
    StartSlaver(&tids,5);
    WaitThread(tids);
    return 0;
}